#include <iostream>
#include <stack>
using namespace std;

int getresult(int a, int b, char c)
{
	switch(c)
	{
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
		case '/':
			return a/b;
	}
}

void calexp(string exp)
{
	stack<char> CS;
	stack<int> NS;
	CS.push('(');
	for(int i=0; i<exp.size(); i++)
	{
		char c = exp[i];
		//当前符号入栈前，总pop出比自己优先级高的或同级的符号，并计算
		//注意）用不入栈，且pop出所有符号和对应的（
		switch(c)
		{
			case '(':
				CS.push(c);
				break;
			case '*':
			case '/':
				while(CS.top() != '(' && CS.top() !='+' && CS.top() != '-')
				{
					char t = CS.top(); CS.pop();
					int b = NS.top(); NS.pop();
					int a = NS.top(); NS.pop();
					NS.push(getresult(a, b, t));
				}
				CS.push(c);
				break;
			case '+':
			case '-':
			case ')':
				while(CS.top() != '(')
				{
					char t = CS.top(); CS.pop();
					int b = NS.top(); NS.pop();
					int a = NS.top(); NS.pop();
					NS.push(getresult(a, b, t));
				}
				if(c != ')')
					CS.push(c);
				else
					CS.pop();
				break;
			default:
				NS.push(int(c - '0'));//shit!
		}
	}
	while(CS.top() != '(')
	{
		char t = CS.top(); CS.pop();
		int b = NS.top(); NS.pop();
		int a = NS.top(); NS.pop();
		NS.push(getresult(a, b, t));
	}	
	cout << NS.top() << endl;
}


int main()
{
	string exp("((3+5)*(4/2))");
	cout << exp << endl;
	calexp(exp);
	string exp2("5*(6+((7-2))*4)");
	cout << exp2 << endl;
	calexp(exp2);
	return 0;
}
